package com.demo.config.apache;

import cn.hutool.core.util.StrUtil;
import com.demo.config.Segment.AnsjSegUtil;
import com.demo.config.apache.util.PDFUtil;
import com.demo.config.apache.util.WordUtil;
import lombok.AllArgsConstructor;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

@AllArgsConstructor
public class demo {

	static String docxFilePath = "D:\\file\\docx\\投标文件.docx";
	static String docxFilePath2 = "D:\\file\\docx\\招标文件.docx";
	static String docxfilePathDemo = "D:\\file\\docx\\模板.docx";
	static String docfilePathDemo = "D:\\file\\doc\\模板.doc";
	static String exportFilePath = "D:\\file\\";

	private static final String IMAGE_PATH = "D:\\file\\test44.png";

	public static void main(String[] args) throws Exception {

		// FileUtil.copyFileSuffix(docFilePath, zhuandocxFilePath);

		// 仅仅针对docx格式的操作
		// String s = printWordDocx(docxFilePath);
		// // 使用ansj_seg 分词技术 取出对应的地名ns/人名nr
		// String nlpAnayNr = AnsjSegUtil.getNlpAnayNr(s);
		// System.out.println(nlpAnayNr);

		// 仅仅针对doc格式的操作
		// printWordDoc(docFilePath);

		// ================================PDF================================================
		// printPdf(pdfFileName);
		// 获取pdf图片 并保存到本地
		// PDFUtil.getPdfOutline();
		// =================================OCR--百度====================================
		// 读取图片文件
		// InputStream inStream = new FileInputStream(IMAGE_PATH);
		// // 将输入流转换为BufferedImage对象
		// BufferedImage bImage = ImageIO.read(inStream);
		// String ocrStr = OcrUtil.ocrSense(bImage);
		//
		// System.out.println(ocrStr);

		// =================================OCR--tess4j====================================

		// 图片识别文字-去除噪点后再处理图片
		// Tess4jUtil.recognizeText(IMAGE_PATH);
		// =====================================================================

	}

	private static void printPdf(String pdfFileName) throws Exception {
		File file = new File(pdfFileName);
		// 加载 pdf 文档,获取PDDocument文档对象
		PDDocument pdDocument = Loader.loadPDF(file);

		// 获取刚要
		// String pdfEssentials = PDFUtil.getPdfEssentials(pdDocument);
		// System.out.println(pdfEssentials);

		// 获取字体名称：LNUHNF+SimSun
		// PDFUtil.getPdfEssentials(pdDocument);

		// 获取文本
		String text = PDFUtil.getText(pdDocument, 0);
		System.out.println(text);

		// 提取图片到指定路径
		// PDFUtil.getPdfImages(pdDocument, exportFilePath);

		pdDocument.close();
	}

	// 仅仅针对doc格式的操作
	private static void printWordDoc(String docFilePath) throws IOException {
		InputStream is = new FileInputStream(docFilePath);
		HWPFDocument doc = new HWPFDocument(is);
		// 文档范围
		Range r = doc.getRange();
		// 获取模板内容及样式
		Map<String, Map<String, String>> docTemplate = WordUtil.getDocTemplate(docfilePathDemo);
		for (int i = 0; i < r.numParagraphs(); i++) {
			Paragraph p = r.getParagraph(i);
			// 按照模板修改文本样式
			WordUtil.updDocFontStyle(p, docTemplate);

		}
		// 下载word -- 生成的文件是二进制？？打不开
		WordUtil.exportDocWord(doc, exportFilePath);
		doc.close();
	}

	/**
	 * 仅仅针对docx格式的操作
	 */
	private static String printWordDocx(String filePath) throws IOException {
		// 将旧文件夹中的所有jpg文件复制到一个新文件夹
		InputStream is = new FileInputStream(filePath);

		// 创建一个新的XWPFDocument对象，从输入流is中读取内容
		XWPFDocument doc = new XWPFDocument(is);
		// 获取段落迭代器
		Iterator<XWPFParagraph> itPara = doc.getParagraphsIterator();
		// 标题
		StringBuilder title = new StringBuilder();
		// 内容
		StringBuilder context = new StringBuilder();
		// 获取模板内容及样式
		// Map<String, Map<String, String>> docTemplate =
		// WordUtil.getDocxTemplate(docxfilePathDemo);
		// 遍历段落
		while (itPara.hasNext()) {
			// 获取下一个段落
			XWPFParagraph paragraph = itPara.next();
			// ==========================================使用模板数据替换文本示例===================================
			// 按照模板修改文本样式
			// WordUtil.updDocxFontStyle(paragraph,docTemplate);
			// ==========================================替换文本示例-包含替换字体大小--文本没问题，颜色大小有点问题===================================
			// HashMap<String, String> map = new HashMap<>();
			// map.put("新绛县绛州古城","西安市钟楼");
			// map.put("新绛县绛州古城2","西安市钟楼2");
			// // 替换文本内容，并修改颜色和大小
			// WordUtil.replaceDocxText(paragraph,map);
			// ==========================================清空下划线以上内容示例===================================
			// WordUtil.delDocxIsUnderlinedText(paragraph);
			// =================================获取满足条件的标题============================================
			// 获取段落中的文本块列表
			// List<XWPFRun> runs = paragraph.getRuns();
			// // 遍历文本块
			// for (int i = 0; i < runs.size(); i++) {
			// XWPFRun xwpfRun = runs.get(i);
			// String fontName = xwpfRun.getFontName();
			// int fontSize = xwpfRun.getFontSize();
			// String fontFamily = xwpfRun.getFontFamily();
			// boolean bold = xwpfRun.isBold();
			// // 获取满足条件的标题
			// if(StrUtil.isNotBlank(xwpfRun.getText(i)) && bold && fontSize > 12){
			// title.append(xwpfRun.getText(i));
			// // 校验样式是否正确
			// String docxStyleName = WordUtil.getDocxFontStyleName(doc, paragraph);
			//// System.out.println(docxStyleName);
			// }
			// }
			// =============================docx
			// 文本内容========================================
			String docxText = WordUtil.getDocxText(doc, paragraph);
			context.append(docxText);

			// =====================================================================

		}
		// 下载word
		// WordUtil.exportDocxWord(doc,exportFilePath);
		doc.close();
		return context.toString();

	}

}
